#include "recfile.h"


/*
**************************************************************************************************************
*										  项 目 全 局 变 量 定 义
**************************************************************************************************************
*/
// typedef struct               // <--------|
// {                            //          |
//   U08  	LL;             	 //          |
//   U08  	LH; 	        	 //          |
//   U08	HL;             	 //          |
//   U08	HH;             	 //          |32BIT与
// } INT_08BIT_4;               //          |
//                              //          |8BIT转换
// typedef union                //          |
// {	                         //          |
//   U32   		Int32Bit;    //          |
//   INT_08BIT_4  	Int08Bit;    //          |
// } INT_32BIT_08BIT;           // <--------|
//========>> 32位<-->8位

typedef struct
{
	U32 sta_add;	//记录存储区域的开始物理地址 
	U32 end_add;	//记录存储区域的结束物理地址(最后一条记录的结束尾地址)
	U32 recsize;	//每条记录长度(包括记录有效数据尾自动添加的2字节CRC校验  总长度)
	U32 pagesize;	//页大小，FLASH存储最小擦除单元大小。
	U32 rvsnum;		//预留页数
}_StcAH_RecFileCfg;

/*
   内部结构体定义
*/
typedef struct
{
	U08 RecFileNo[4];	//记录文件编号1--64000  [正][反][正][反] 每操作一次会加1
	U32 MaxRecNo;		//记录编号 1-0xFFFFFFFF循环，
	U32 WriteAdd;		//写指针，写地址 写下一条记录的开始地址 相对地址 0-最大循环
	U32 ReadAdd;		//读指针，读地址 读下一条记录的开始地址	相对地址 0-最大循环
	U32 RecNumber;		//未上传的记录数 
	U08 Rvs[2];			//保留2字节
	U16 Crc;			//CRC校验
}_Stc_RecDirFile;		//记录目录文件24字节

_Stc_RecDirFile			RecDirFile[AH_DEF_REC_FILE_NO];				//记录目录文件结构体

_StcAH_RecFileCfg       RecCfg[AH_DEF_REC_FILE_NO];

U32 AH_FLASH_ReadData( U32 id, U32 add, U08 *buf, U32 size, U32 back_add, U32 stat )
{
	char fname[20];
	FILE * fid;
	U32 ret = 0;

	memset(fname,0,20);
	sprintf(fname,"rec%02x.bin",id);
	fid = fopen(fname,"rb");
	if( fid < 0 )
	{
		DEF_Err_Debug;
		goto Error;
	}
	ret = fseek(fid, add, SEEK_SET);
	if( ret != 0 )
		goto Error;
	ret = fread( buf,1,size,fid);
	if( ret < 0 )
		goto Error;
	else if( ret < size )
		return 1;
	ret = fclose(fid);
	if( ret != 0 )
		goto Error;

	return 0;
	Error:
	DEF_Err_Debug;
	return 1;
}
U32 AH_FLASH_WriteData( U32 id,U32 add, U08 *buf, U32 size, U32 back_add, U32 stat, U32 mode )
{
	char fname[20];
	FILE * fid;
	U32 ret = 0;

	memset(fname,0,20);
	sprintf(fname,"rec%02x.bin",id);
    //size = RecCfg[dirid].recsize;               //记录长度
	//===================>>写记录
	fid = fopen(fname,"ab");
	if( fid < 0 )
	{
		DEF_Err_Debug;
		goto Error;
	}
	ret = fseek(fid, add, SEEK_SET);
	if( ret != 0 )
		goto Error;
	CurCalc_DataCrc(buf,size-2,1);
	ret = fwrite(buf,size,1,fid);
	if( ret < 0 )
		goto Error;

	ret = fclose(fid);
	if( ret != 0 )
		goto Error;

	return 0;
	Error:
	DEF_Err_Debug;
	return 1;
}
U32 AH_FRAM_WriteData( U32 id, U32 add, U08 *buf, U32 size, U32 back_add, U32 stat )
{
	U32 ret;
	char dname[20];
	FILE * fid;

	memset(dname,0,20);
	sprintf(dname,"rec%02x.dir",id);

	fid = fopen(dname,"wb");
	if( fid < 0 )
	{
		DEF_Err_Debug;
		goto Error;
	}
	ret = fseek(fid, add, SEEK_SET);								//fseekµÄadd·¶Î§±ØÐëÐ¡ÓÚµÈÓÚÎÄ¼þ´óÐ¡£¬·ñÔò»áÒç³ö
	if( ret != 0 )
		goto Error;
	ret = fwrite(buf,size,1,fid);
	if( ret < 0 )
		goto Error;

	ret = fclose(fid);
	if( ret != 0 )
		goto Error;

	return 0;
	Error:
	DEF_Err_Debug;
	return 1;
}
																	
U32 AH_FRAM_ReadData( U32 id, U32 add, U08 *buf, U32 size, U32 back_add, U32 stat )
{
	U32 ret;
	char dname[20];
	FILE * fid;

	memset(dname,0,20);
	sprintf(dname,"rec%02x.dir",id);

	fid = fopen(dname,"rb");
	if( fid < 0 )
	{
		DEF_Err_Debug;
		goto Error;
	}
	ret = fseek(fid, add, SEEK_SET);	
	if( ret != 0 )
		goto Error;
	ret = fread(buf, 1,size,fid);
	if( ret < 0 )
		goto Error;
	else if( ret < size )	//
		return 1;
	ret = fclose(fid);
	if( ret != 0 )
		goto Error;

	return 0;
	Error:
	DEF_Err_Debug;
	return 1;
}

U32 APP_Create_RecFile( U32 id, U32 rp, U32 mode )		//创建记录文件
{
	U32 dirid,ret;
	char fname[20];
	FILE * fid;
	
	memset(fname,0,20);
	sprintf(fname,"rec%02x.bin",id);

	dirid = ( id - 1 );	 

	RecDirFile[dirid].RecFileNo[0] = 0x00;   				//记录文件编号
	RecDirFile[dirid].RecFileNo[1] = 0xFF;   	 			//记录文件编号
	RecDirFile[dirid].RecFileNo[2] = 0x01;   				//记录文件编号
	RecDirFile[dirid].RecFileNo[3] = 0xFE;   				//记录文件编号
	RecDirFile[dirid].MaxRecNo = 0;							//记录编号
	RecDirFile[dirid].WriteAdd = 0;   						//写指针，写地址
	RecDirFile[dirid].ReadAdd  = 0;   						//读指针，读地址
	RecDirFile[dirid].RecNumber= 0;  						//未上传的记录数
	memset( RecDirFile[dirid].Rvs, 0, 2 );			//保留2字节

	CurCalc_DataCrc(RecDirFile[dirid].RecFileNo,AH_DEF_REC_DIR_SIZE-2,1);

	ret = AH_FRAM_WriteData(id,0,RecDirFile[dirid].RecFileNo,AH_DEF_REC_DIR_SIZE,0,0);
	if( ret != 0 )
	{ DEF_Err_Debug;return ret;	}

	//DEF_Err_Debug;
	if( mode == 1)//格式化记录文件，原有的记录将被覆盖
	{
		//DEF_Err_Debug;
		fid = fopen(fname,"wb");
		if( fid < 0 )
		{
			DEF_Err_Debug;
			return 1;
		}
		ret = fclose(fid);
		if( ret != 0 )
	    { DEF_Err_Debug;return ret;	}
	}

	return 0;
}
U32 APP_Open_RecFile( U32 id )						//打开记录文件
{
	U32 dirid,ret;

	dirid = ( id - 1 );	 

	ret = AH_FRAM_ReadData(id,0,RecDirFile[dirid].RecFileNo,AH_DEF_REC_DIR_SIZE,0,0);
	if( ret != 0 )
	{ DEF_Err_Debug;return ret;	}

	switch(dirid)
	{
		case 0x00:RecCfg[dirid].recsize = DEF_REC_LEN_SIZE_01;//记录长度
		break;
		case 0x01:RecCfg[dirid].recsize = DEF_REC_LEN_SIZE_02;//记录长度
		break;
		case 0x02:RecCfg[dirid].recsize = DEF_REC_LEN_SIZE_03;//记录长度
		break;
		case 0x03:RecCfg[dirid].recsize = DEF_REC_LEN_SIZE_04;//记录长度
		break;
		case 0x04:RecCfg[dirid].recsize = DEF_REC_LEN_SIZE_05;//记录长度
		break;
		case 0x05:RecCfg[dirid].recsize = DEF_REC_LEN_SIZE_06;//记录长度
		break;
		case 0x06:RecCfg[dirid].recsize = DEF_REC_LEN_SIZE_07;//记录长度
		break;
		case 0x07:RecCfg[dirid].recsize = DEF_REC_LEN_SIZE_08;//记录长度
		break;
		case 0x08:RecCfg[dirid].recsize = DEF_REC_LEN_SIZE_09;//记录长度
		break;
		case 0x09:RecCfg[dirid].recsize = DEF_REC_LEN_SIZE_10;//记录长度
		break;
	}

	//printf("RecFileNo:%02x%02x\n",RecDirFile[dirid].RecFileNo[0] ,RecDirFile[dirid].RecFileNo[2]);

	return 0;
}
U32 APP_Read_RecFile_NotServer( U32 id, U32 rp, U32 sn, U08 *buf )
{
	U32 dirid,ret,add1,add2;
	U08 info[32];
	U32 rec_num;
	U32 sncout;//maxwadd;

	dirid  = ( id - 1 );	
	sncout = ( sn & 0x0FFFFFFF );							//需要读取记录的编号数

	info[0] = RecDirFile[dirid].RecNumber >> 24;
	info[1] = RecDirFile[dirid].RecNumber >> 16;
	info[2] = RecDirFile[dirid].RecNumber >> 8;
	info[3] = RecDirFile[dirid].RecNumber;					//未上传记录数
	rec_num = ( ( info[0]  << 24 ) | ( info[1]  << 16 ) | ( info[2] << 8 ) | info[3] );
	if( sn > rec_num )							//无记录
	{ 
		DEF_Err_Debug;
		ret = NC_NoRecERR; 
		goto Err_RET;
	}
    
    if( ( sn & 0xF0000000 ) == 0x00000000 )					//读取顺数第xxxxxxx条未上传记录，按顺序
	{
		add1 = RecDirFile[dirid].ReadAdd;					//获取默认第一条记录的开始地址
		
		add1 = ( add1 + ( ( sncout - 1 ) * RecCfg[dirid].recsize ) );	
		// if( add1 >= maxwadd )
		// { add1 = ( add1 - maxwadd ); }		
		add1  = ( 0 + add1 );					//找到记录存储的物理地址
		ret = AH_FLASH_ReadData( id,
				                   add1,
								   buf, 
								   RecCfg[dirid].recsize, 
								   0, 
								   0 );
		if( ret != 0 )									//读取失败，直接返回
		{ DEF_Err_Debug;return ret;	}
		return 0;		
	}
	else if( ( sn & 0xF0000000 ) == 0x10000000 )			//读取倒数第xxxxxxx条写入的记录，按顺序
	{
		add1 = RecDirFile[dirid].WriteAdd;					//获取写入下一条记录的开始地址	
		
		add2 = ( sncout * RecCfg[dirid].recsize );			//计算需要后退的地址空间
		if( add2 > add1 )									//需要饶圈了
		{
			add2 = ( add2 - add1 );
			//add1 = ( maxwadd - add2 );
		}
		else												//正常后退
		{ add1 = ( add1 - add2 ); }

		add1 = 0 + add1;						//找到记录存储的物理地址
		ret = AH_FLASH_ReadData( id,
				                   add1,
								   buf, 
								   RecCfg[dirid].recsize, 
								   0, 
								   0 );
		if( ret != 0 )
		{ DEF_Err_Debug;return ret;	}
		return 0;	
	}
	else if( ( sn & 0xF0000000 ) == 0x20000000 )			//读取第xxxxxxx条记录,按编码位置读取
	{
		add1 = ( ( sncout - 1 ) * RecCfg[dirid].recsize );		//找到记录存储的相对地址
		add1 = 0 + add1;						//找到记录存储的物理地址
		ret = AH_FLASH_ReadData( id,
				                   add1,
								   buf, 
								   RecCfg[dirid].recsize, 
								   0, 
								   0 );
        if( ret != 0 )
		{ DEF_Err_Debug;return ret;	}
		return 0;				
	}
	return 260;

	Err_RET:
	return ret;
}															//读取一条记录  顺序读取第SN条未上传的记录
U32 APP_Read_RecFile_WriteNot( U32 id, U32 sn, U08 *buf )
{
	U32 dirid,ret,add1,add2;
	U08 info[32];
	U32 rec_num;
	U32 sncout;//maxwadd;

	dirid  = ( id - 1 );	
	sncout = ( sn & 0x0FFFFFFF );							//需要读取记录的编号数

	// info[0] = RecDirFile[dirid].RecNumber >> 24;
	// info[1] = RecDirFile[dirid].RecNumber >> 16;
	// info[2] = RecDirFile[dirid].RecNumber >> 8;
	// info[3] = RecDirFile[dirid].RecNumber;					//未上传记录数
	// rec_num = ( ( info[0]  << 24 ) | ( info[1]  << 16 ) | ( info[2] << 8 ) | info[3] );
	// if( sn > rec_num )							//无记录
	// { 
	// 	DEF_Err_Debug;
	// 	ret = NC_NoRecERR; 
	// 	goto Err_RET;
	// }
    sn = ( sn | 0x10000000 );
    
    if( ( sn & 0xF0000000 ) == 0x00000000 )					//读取顺数第xxxxxxx条未上传记录，按顺序
	{
		add1 = RecDirFile[dirid].ReadAdd;					//获取默认第一条记录的开始地址
		
		add1 = ( add1 + ( ( sncout - 1 ) * RecCfg[dirid].recsize ) );	
		// if( add1 >= maxwadd )
		// { add1 = ( add1 - maxwadd ); }		
		add1  = ( 0 + add1 );					//找到记录存储的物理地址
		ret = AH_FLASH_ReadData( id,
				                   add1,
								   buf, 
								   RecCfg[dirid].recsize, 
								   0, 
								   0 );
		if( ret != 0 )									//读取失败，直接返回
		{ DEF_Err_Debug;return ret;	}
		return 0;		
	}
	else if( ( sn & 0xF0000000 ) == 0x10000000 )			//读取倒数第xxxxxxx条写入的记录，按顺序
	{
		add1 = RecDirFile[dirid].WriteAdd;					//获取写入下一条记录的开始地址	
		
		add2 = ( sncout * RecCfg[dirid].recsize );			//计算需要后退的地址空间
		if( add2 > add1 )									//需要饶圈了
		{
			add2 = ( add2 - add1 );
			//add1 = ( maxwadd - add2 );
		}
		else												//正常后退
		{ add1 = ( add1 - add2 ); }

		add1 = 0 + add1;						//找到记录存储的物理地址
		ret = AH_FLASH_ReadData( id,
				                   add1,
								   buf, 
								   RecCfg[dirid].recsize, 
								   0, 
								   0 );
		if( ret != 0 )
		{ DEF_Err_Debug;return ret;	}
		return 0;	
	}
	else if( ( sn & 0xF0000000 ) == 0x20000000 )			//读取第xxxxxxx条记录,按编码位置读取
	{
		add1 = ( ( sncout - 1 ) * RecCfg[dirid].recsize );		//找到记录存储的相对地址
		add1 = 0 + add1;						//找到记录存储的物理地址
		ret = AH_FLASH_ReadData( id,
				                   add1,
								   buf, 
								   RecCfg[dirid].recsize, 
								   0, 
								   0 );
        if( ret != 0 )
		{ DEF_Err_Debug;return ret;	}
		return 0;				
	}
	return 260;

	Err_RET:
	return ret;
}															//读取一条记录  倒数读取第SN条写入的记录
U32 APP_Read_RecFile_PHY( U32 id, U32 sn, U08 *buf )	//读取一条记录  读取第SN条记录,按编码位置读取
{
	return 0;
}
U32 APP_Get_RecFileNum( U32 id, U32 rp, U32 *num )		//获取未上传的记录数
{
	U32 dirid;
	U08 info[32];

	dirid = ( id - 1 );	 

	info[0] = RecDirFile[dirid].RecNumber >> 24;
	info[1] = RecDirFile[dirid].RecNumber >> 16;
	info[2] = RecDirFile[dirid].RecNumber >> 8;
	info[3] = RecDirFile[dirid].RecNumber;					//未上传记录数

	*num = ( ( info[0] << 24 ) | ( info[1] << 16 ) | ( info[2] << 8 ) | info[3] );

	return 0;
}						
U32 APP_Get_RecFileNO( U32 id, U32 *phyno, U32 *no )	//获取最后一条记录流水号
{
	U32 dirid;
	U08 info[32];

	dirid = ( id - 1 );	 

	info[0] = RecDirFile[dirid].RecNumber >> 24;
	info[1] = RecDirFile[dirid].RecNumber >> 16;
	info[2] = RecDirFile[dirid].RecNumber >> 8;
	info[3] = RecDirFile[dirid].RecNumber;					//未上传记录数

	info[4] = RecDirFile[dirid].MaxRecNo >> 24;
	info[5] = RecDirFile[dirid].MaxRecNo >> 16;
	info[6] = RecDirFile[dirid].MaxRecNo >> 8;
	info[7] = RecDirFile[dirid].MaxRecNo;					//记录流水号

	info[8] = RecDirFile[dirid].WriteAdd >> 24;
	info[9] = RecDirFile[dirid].WriteAdd >> 16;
	info[10] = RecDirFile[dirid].WriteAdd >> 8;
	info[11] = RecDirFile[dirid].WriteAdd;					//记录写地址

	info[12]  = RecDirFile[dirid].ReadAdd >> 24;
	info[13]  = RecDirFile[dirid].ReadAdd >> 16;
	info[14] = RecDirFile[dirid].ReadAdd >> 8;
	info[15] = RecDirFile[dirid].ReadAdd;					//记录读地址

	memcpy( info+16, RecDirFile[dirid].RecFileNo, 4 );

	*no    = ( ( info[16] << 24 ) | ( info[17] << 16 ) | ( info[18] << 8 ) | info[19] );
	*phyno = ( ( info[4]  << 24 ) | ( info[5]  << 16 ) | ( info[6]  << 8 ) | info[7] );	

	return 0;
}
U32 APP_Write_RecFile( U32 id, U08 *buf )			//追加写入一条记录
{
	U32 dirid,ret,size;
	U32 wadd_cur,wadd_next;
	INT_32BIT_08BIT Int32; 

	dirid = ( id - 1 );	 
	wadd_next = RecDirFile[dirid].WriteAdd;				//获取写入下一条记录的开始地址
	wadd_cur = wadd_next;								//暂存写入当前这条记录的地址
    size = RecCfg[dirid].recsize;               //记录长度
	//===================>>写记录
	ret = AH_FLASH_WriteData(id,wadd_cur,buf,size,0,0,0);
	if( ret != 0 )
	{ DEF_Err_Debug;return ret;	}
	//===================>> 更新记录写指针
	wadd_next = ( wadd_cur + size );		//暂存写入下一次记录的开始地址 相对地址
	RecDirFile[dirid].WriteAdd = wadd_next;					//保存写入下一条记录的开始地址
	//===================>> 更新记录流水号与未上传的记录数
	if( RecDirFile[dirid].WriteAdd != RecDirFile[dirid].ReadAdd )
	{
		if( RecDirFile[dirid].WriteAdd > RecDirFile[dirid].ReadAdd )
		{													//未上传记录数量
			RecDirFile[dirid].RecNumber = ( ( RecDirFile[dirid].WriteAdd - RecDirFile[dirid].ReadAdd ) / RecCfg[dirid].recsize );
		}
		else
		{											 		//相对地址
			RecDirFile[dirid].RecNumber  = ( RecDirFile[dirid].WriteAdd / RecCfg[dirid].recsize );
			RecDirFile[dirid].RecNumber += ( ( ( RecCfg[dirid].end_add - RecCfg[dirid].sta_add ) - RecDirFile[dirid].ReadAdd ) / RecCfg[dirid].recsize );
		}		
	}
	else
	{ RecDirFile[dirid].RecNumber = 0; }					//未上传记录数

	RecDirFile[dirid].MaxRecNo ++;							//记录流水号加1 1--FFFFFFFF循环
	if( RecDirFile[dirid].MaxRecNo == 0 )
	{ RecDirFile[dirid].MaxRecNo = 1; }

	//===================>> 保存更新后的记录指针
	Int32.Int08Bit.HH = 0;
	Int32.Int08Bit.HL = 0;
	Int32.Int08Bit.LH = RecDirFile[dirid].RecFileNo[0];		//正H
	Int32.Int08Bit.LL = RecDirFile[dirid].RecFileNo[2];		//正L
	Int32.Int32Bit++;				  						//编号自动加1
	if( Int32.Int32Bit > DEF_CycMemMaxCout )				//大于最大值归1
	{ Int32.Int32Bit = 1; }

	RecDirFile[dirid].RecFileNo[0] =  Int32.Int08Bit.LH;	//正H
	RecDirFile[dirid].RecFileNo[1] = ~Int32.Int08Bit.LH;	//反H
	RecDirFile[dirid].RecFileNo[2] =  Int32.Int08Bit.LL;	//正L
	RecDirFile[dirid].RecFileNo[3] = ~Int32.Int08Bit.LL;	//反L
	CurCalc_DataCrc(RecDirFile[dirid].RecFileNo,AH_DEF_REC_DIR_SIZE-2,1);

	ret = AH_FRAM_WriteData(id,0,RecDirFile[dirid].RecFileNo,AH_DEF_REC_DIR_SIZE,0,0);
	if( ret != 0 )
	{ DEF_Err_Debug;return ret;	}

	return 0;

}
U32 APP_Delete_RecFile( U32 id, U32 rp, U08 *buf, U32 recnum )				//删除多条记录
{
	U32 dirid,ret;
	U32 i,radd_cur,cout;
	INT_32BIT_08BIT Int32; 

	//size = AH_DEF_REC_DIR_SIZE;
	dirid = ( id - 1 );	 

	cout = 0;
	radd_cur = RecDirFile[dirid].ReadAdd;

	for( i = 0; i < recnum; i++ ) 							//需要删除的总记录数
	{
		radd_cur += RecCfg[dirid].recsize;						//更新发送指针
		//if( radd_cur >= maxwadd )							//第一圈完，从头开始 201109
		//{ radd_cur = 0; }
		cout++;
		if( cout > RecDirFile[dirid].RecNumber )			//读取结束
		{ goto END; }
	} 

	END:
	RecDirFile[dirid].ReadAdd = radd_cur;					//更新读指针
	if( RecDirFile[dirid].WriteAdd != RecDirFile[dirid].ReadAdd )
	{													
		if( RecDirFile[dirid].WriteAdd > RecDirFile[dirid].ReadAdd )
		{													//未上传记录数量
			RecDirFile[dirid].RecNumber = ( ( RecDirFile[dirid].WriteAdd - RecDirFile[dirid].ReadAdd ) / RecCfg[dirid].recsize );
		}
		else
		{											 		//相对地址
			RecDirFile[dirid].RecNumber  = ( RecDirFile[dirid].WriteAdd / RecCfg[dirid].recsize );
			RecDirFile[dirid].RecNumber += ( ( ( RecCfg[dirid].end_add - RecCfg[dirid].sta_add ) - RecDirFile[dirid].ReadAdd ) / RecCfg[dirid].recsize );
		}		
	}
	else
	{ RecDirFile[dirid].RecNumber = 0; }					//未上传记录数

	Int32.Int08Bit.HH = 0;
	Int32.Int08Bit.HL = 0;
	Int32.Int08Bit.LH = RecDirFile[dirid].RecFileNo[0];		//正H
	Int32.Int08Bit.LL = RecDirFile[dirid].RecFileNo[2];		//正L
	Int32.Int32Bit++;				  						//编号自动加1
	if( Int32.Int32Bit > DEF_CycMemMaxCout )				//大于最大值归1
	{ Int32.Int32Bit = 1; }

	RecDirFile[dirid].RecFileNo[0] =  Int32.Int08Bit.LH;	//正H
	RecDirFile[dirid].RecFileNo[1] = ~Int32.Int08Bit.LH;	//反H
	RecDirFile[dirid].RecFileNo[2] =  Int32.Int08Bit.LL;	//正L
	RecDirFile[dirid].RecFileNo[3] = ~Int32.Int08Bit.LL;	//反L

	//更新记录文件
	CurCalc_DataCrc(RecDirFile[dirid].RecFileNo,AH_DEF_REC_DIR_SIZE-2,1);

	ret = AH_FRAM_WriteData(id,0,RecDirFile[dirid].RecFileNo,AH_DEF_REC_DIR_SIZE,0,0);
	if( ret != 0 )
	{ DEF_Err_Debug;return ret;	}
	
	return 0;
}


U32 APP_Get_RecFileStat( U32 id, U32 *sta )				//获取记录文件状态
{
	*sta = 0;
	return 0;
}
U32 APP_Set_RecReadp( U32 id, U32 outrp, U32 inrp )	//记录多指针处理
{
	return 0;
}

U32 APP_Read_Useful_RecFile_NotServer( U32 id, U32 rp, U32 sn, U08 *buf )
{
	U32 i,j;
	U32 ReadOkCtr = 0;                                          			//读取一条记录成功时计数
	U32 rcode; 

	i = 0;
	while( 1 )
	{  
		i++;
		for( j = 0; j < DEF_RecMaxCout; j++ )
		{
			rcode = APP_Read_RecFile_NotServer( id, 0,i, buf );        		//读取一条记录  
			if( rcode == 0 )	
			{ break; }
		}
		if( rcode != 0 )                                      				//读取异常,进一步分析
		{ 	
			if( ( rcode == NC_FlashErr ) || ( rcode == NC_NoRecERR ) )		//硬性故障直接返回,再读无意义
			{ 
				return rcode;	
			}
			else                                           					//其它错误(如校验错等),,退出当前循环重新读
			{ continue;	}                                                    	                                            
		}	
		else                                                				//读取成功则开始计数
		{
			ReadOkCtr++;                                      				//读取记录成功则计数 
			if( ReadOkCtr == sn ) 
			{ 
				return 0; 													//返回成功
			}                         							
		}	 
	}
	return 1;
}
